﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using VV策略设置类库;
using YY监控对象类库;

namespace DD融资买入类库
{
    public partial class 融资买入 : UserControl
    {
        public 融资买入()
        {
        InitializeComponent();
        }

        //调用封装的模板
        List<融资买入模板> list = new List<融资买入模板>();                //泛型集合

        Int32 iNumber = 1;                                                                   //iNumber是策略编号

        //如果开关1=true，添加1和删除1起作用，如果开关1=False添加1和删除1不起作用  
        private void 添加1_Click(object sender, EventArgs e)               //点击添加1就添加1列模板
        {
        if (this.开关.Checked == true)                                                   //开关1被勾选才能添加
        {

        融资买入模板 user = new 融资买入模板();                                  //新建一个模板，融资买入模板
        user.Location = new Point(list.Count * user.Width + 70, 9);    //70是距离左边距离，9是距离上边距离

        user.设置策略名称("融资策略" + iNumber++);                          //策略号+1

        容器1.Controls.Add(user);                                                         //将模板插入到容器中
        list.Add(user);
        }
        }
        private void 删除1_Click(object sender, EventArgs e)              //点击删除1就删除一列模板
        {
        if (this.开关.Checked == true)                                                  //开关1被勾选才能删除
        {
        if (list.Count > 0)                                                                     //如果容器中的模板大于0，点击删除1键时执行删除一个模板
        {
        容器1.Controls.Remove(list[list.Count - 1]);                              //将模板从容器中删除
        list.RemoveAt(list.Count - 1);                                                   //删除容器中的1个模板
        }
        }
        }
        //与配置文件关联，鼠标点击添加1时，添加保存1条新记录
        private void 添加1_MouseClick(object sender, MouseEventArgs e)   //鼠标点击添加1时要执行的动作
        {

        }
        //与配置文件关联，鼠标点击删除1时，删除1条记录
        private void 删除1_MouseClick(object sender, MouseEventArgs e)   //鼠标点击删除1时要执行的动作
        {

        }

        private void 年过滤A1_Click(object sender, EventArgs e)          //点击打开策略设置窗口
        {
        策略设置 frm = new 策略设置();
        frm.ShowDialog();                                                                      //用模式对话框打开的方式
        }
        private void 年过滤A2_Click(object sender, EventArgs e)          //点击打开策略设置窗口
        {
        策略设置 frm = new 策略设置();
        frm.ShowDialog();                                                                    //置();用模式对话框打开的方式
        }
        private void 监控对象_Click(object sender, EventArgs e)          //点击打开策略设置窗口
        {
        监控对象 frm = new 监控对象();
        frm.ShowDialog();                                                                    //用模式对话框打开的方式，显示子窗体
        }
    }
}




































//定义：string[,] 名字 = new string[2, 3];     中括号中加一个逗号就是二维数组，等号后面的中括号内，2代表含有两个数组，3代表其中的每个数组里面有3个数值。
//定义：string[,,] 名字 = new string[2, 3, 4]; 中括号内加两个逗号就是三维数组，有2个二维数组，每一个二维数组中有3个一维数组，每一个一维数组中有4个变量


//多个模块组建成一个程序集，多个类组建成一个模块，多个方法组建成一个类，模块里可以声明类，类里可以创建方法、属性、字段。方法需要在类中才可以创建的，局部变量是声明在方法体内等等规则。


//如何获取二维数组中的元素个数呢？

//int[,] array = new int[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };  //定义一个3行3列的二维数组
//int row = array.Rank;                   //获取维数，这里指行数
//int col = array.GetLength(1);           //获取指定维度中的元素个数，这里也就是列数了。（0是第一维，1表示的是第二维）
//int col = array.GetUpperBound(0) + 1;   //获取指定维度的索引上限，在加上一个1就是总数，这里表示二维数组的行数
//int num = array.Length;                 //获取整个二维数组的长度，即所有元的个数


//首先需要知道动态创建这些类型是使用的一些什么技术呢？其实只要相关动态加载程序集呀，类呀，都是使用反射，那么动态创建也一样使用的是反射，是属于反射的技术！也就是将对象或者数据映射成一个对象或者程序集保存起来而已。

//首先我们需要了解每个动态类型在.net中都是用什么类型来表示的。

//程序集：System.Reflection.Emit.AssemblyBuilder(定义并表示动态程序集)

//构造函数：System.Reflection.Emit.ConstructorBuilder(定义并表示动态类的构造函数)

//自定义属性：System.Reflection.Emit.CustomAttributeBuilder(帮助生成自定义属性 使用构造函数传递的参数来生成类的属性)

//枚举：System.Reflection.Emit.EnumBuilder(说明并表示枚举类型)

//事件：System.Reflection.Emit.EventBuilder(定义类的事件)

//字段：System.Reflection.Emit.FieldBuilder(定义并表示字段。无法继承此类)

//局部变量：System.Reflection.Emit.LocalBuilder(表示方法或构造函数内的局部变量)

//方法：System.Reflection.Emit.MethodBuilder(定义并表示动态类的方法（或构造函数）)

//模块：System.Reflection.Emit.ModuleBuilder(定义和表示动态程序集中的模块)

//参数：System.Reflection.Emit.ParameterBuilder(创建或关联参数信息 如：方法参数，事件参数等)

//属性：System.Reflection.Emit.PropertyBuilder(定义类型的属性 (Property))

//类：System.Reflection.Emit.TypeBuilder(在运行时定义并创建类的新实例)

//我们有了这些类型，基本上就可以动态创建我们的任何需要使用的类型，当然很多可以动态创建的类型我不可能都介绍完，如果在项目中有需要可以去查阅MSDN，里面都有DEMO的，主要的问题就是要理解每一种类型的定义，比如：程序集加载是靠AppDomain，程序集里包含多个模块，模块里可以声明类，类里可以创建方法、属性、字段。方法需要在类中才可以创建的，局部变量是声明在方法体内等等规则。看MSDN就非常容易弄懂了。

//1.如何动态创建它们了

//AppDomain：应用程序域（由 AppDomain 对象表示）为执行托管代码提供隔离、卸载和安全边界。AppDomain同时可以载入多个程序集，共同来实现功能。

//程序集：简单来说就是一个以公共语言运行库（CLR）为宿主的、版本化的、自描述的二进制文件。（说明：定义来自C#与.NET3.5高级程序设计(第四版)）

//模块：类似于以前的单元，用于分割不同的类和类型，以及资源(resource, 资源记录就是字符串，图象以及其它数据，他们只在需要的时候才会被调入内存)。类型的Meta信息也是模块的一部分。多个模块组建成一个程序集。

//所谓动态就是在程序运行时，动态的创建和使用。////动态创建程序集
//AssemblyName DemoName = new AssemblyName("DynamicAssembly");
//AssemblyBuilder dynamicAssembly = AppDomain.CurrentDomain.DefineDynamicAssembly(DemoName, AssemblyBuilderAccess.RunAndSave);
////动态创建模块
//ModuleBuilder mb = dynamicAssembly.DefineDynamicModule(DemoName.Name, DemoName.Name + ".dll");
////动态创建类MyClass
//TypeBuilder tb = mb.DefineType("MyClass", TypeAttributes.Public);
////动态创建字段
//FieldBuilder fb = tb.DefineField("", typeof(System.String), FieldAttributes.Private);
////动态创建构造函数
//Type[] clorType = new Type[] { typeof(System.String) };
//ConstructorBuilder cb1 = tb.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, clorType);
////生成指令
//ILGenerator ilg = cb1.GetILGenerator();//生成 Microsoft 中间语言 (MSIL) 指令
//ilg.Emit(OpCodes.Ldarg_0);
//            ilg.Emit(OpCodes.Call, typeof(object).GetConstructor(Type.EmptyTypes));
//            ilg.Emit(OpCodes.Ldarg_0);
//            ilg.Emit(OpCodes.Ldarg_1);
//            ilg.Emit(OpCodes.Stfld, fb);
//            ilg.Emit(OpCodes.Ret);
//            //动态创建属性
//            PropertyBuilder pb = tb.DefineProperty("MyProperty", PropertyAttributes.HasDefault, typeof(string), null);
////动态创建方法
//MethodAttributes getSetAttr = MethodAttributes.Public | MethodAttributes.SpecialName;
//MethodBuilder myMethod = tb.DefineMethod("get_Property", getSetAttr, typeof(string), Type.EmptyTypes);
////生成指令
//ILGenerator numberGetIL = myMethod.GetILGenerator();
//numberGetIL.Emit(OpCodes.Ldarg_0);
//            numberGetIL.Emit(OpCodes.Ldfld, fb);
//            numberGetIL.Emit(OpCodes.Ret);
//            //保存动态创建的程序集
//            dynamicAssembly.Save(DemoName.Name + ".dll");
